#ifndef __C_UTILS_STRING__H__
#define __C_UTILS_STRING__H__

/*******************************************************************************
***
***  Author: AngryPigFourier
***
***  Version: 0.0.1
***  Purpose: C-Utils string functions in C
***
*******************************************************************************/

#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif


#define CU_CMP_SENSITIVE        1
#define CU_CMP_INSENSITIVE      0

#define CU_STRING_VERSION       "0.0.1"


char* cu_string_toupper(char* s);

char* cu_string_tolower(char* s);

int cu_string_strcmp(const char *s1, const char *s2, int casesensitive);

int cu_string_strncmp(const char *s1, const char *s2, size_t n, int casesensitive);

char *cu_string_strcpy(char *dest, const char *src);

char *cu_string_strncpy(char *dest, const char *src, size_t n);

char *cu_string_strcat(char *dest, const char *src);

char *cu_string_strncat(char *dest, const char *src, size_t n);

/* 将字符串s复制到内存d中，以\0结尾 */
size_t cu_string_duplicate(const char* s, char* d, size_t n);

/* 反转一个字符串 */
char* cu_string_reverse(char* s);

/* 去除头和尾的空格，返回删除的字符数 */
size_t cu_string_trim(char* s);

/* 格式化字符串 */
int cu_string_sprintf(char *str, const char *format, ...);
int cu_string_snprintf(char *str, size_t size, const char *format, ...);

/*
*  字符串替换字符相关函数
*/
/* 使用字符w替换字符串s中的字符c */
char* cu_string_replace_char(char* s, const char c, const char w);

/* 使用字符w替换字符串c中包含的字符 */
char* cu_string_replace_chars(char* s, const char* c, const char w);

/*
*  字符串删除字符相关函数
*/
/* 使用字符w替换字符串s中的字符c */
char* cu_string_remove_char(char* s, const char c);

/* 使用字符w替换字符串s中的字符c */
char* cu_string_remove_chars(char* s, const char* c);

/*
*  字符串查找相关函数
*/

/* 在字符串s中找到第一个字符c的位置，若能找到，则返回第一个字串的地址；否则返回NULL */
char* cu_string_strchr(const char* s, const char c);

/* 在字符串s中找到最后一个字符c的位置，若能找到，则返回最后一个字串的地址；否则返回NULL */
char* cu_string_strrchr(const char* s, const char c);

/* 在字符串s中找第一个字符c，返回第一个字符c的位置；未找到则返回-1 */
int cu_string_find_char(const char* s, const char c);

/* 在字符串s中找最后个字符c，返回最后一个字符c的位置；未找到则返回-1 */
int cu_string_find_char_r(const char* s, const char c);

/* 在字符串s中找到第一个字串sub的位置，若能找到，则返回第一个字串的地址；否则返回NULL */
char* cu_string_strstr(const char* s, const char* sub);

/* 在字符串s中找到最后一个字串sub的位置，若能找到，则返回最后一个字串的地址；否则返回NULL */
char* cu_string_strrstr(const char* s, const char* sub);

/* 在字符串s中找到第一个字串sub的位置，若能找到，则返回第一个字串在字符串中的的位置；否则返回-1 */
int cu_string_find_string(const char* s, const char* sub);

/* 在字符串s中找到最后一个字串sub的位置，若能找到，则返回最后一个字串在字符串中的的位置；否则返回-1 */
int cu_string_find_string_r(const char* s, const char* sub);

/* 在字符串s中找到字符串s2中的任意一个字符的位置 */
int cu_string_find_any(const char* s, const char* s2);

/* 在字符串s中找到字符串s2中的任意一个字符的位置  */
int cu_string_find_any_r(const char* s, const char* s2);

/*
*  字符串分割
*/
int cu_string_split_char(const char* s, const char c, char** d, int num);
int cu_string_split_string(const char* s, const char* s2, char** d, int num);

#ifdef __cplusplus
} // extern "C"
#endif

#endif /* __C_UTILS_STRING__H__ */
